home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
090
/
pctj8410.arc
/
INSIDE.BAS
< prev
next >
Wrap
BASIC Source File
|
1986-09-14
|
7KB
|
183 lines
10 ' Program to print data in a Worksheet File
20 ' W. F. Sharpe, February 1984
30 '
40 ' Main Program
50 GOSUB 120 ' open file
60 RECORDTYPE% = 0
70 WHILE RECORDTYPE% <> 1
80 GOSUB 210 ' read and process a record
90 WEND
100 END
110 '
120 ' Procedure to open the worksheet file
130 INPUT "Worksheet name: "; FLNAME$
140 FLNAME$=FLNAME$+".WKS"
150 OPEN FLNAME$ AS 1 LEN=128
160 FIELD #1, 128 AS BUFFER$
170 GET #1
180 POINTER% = 1
190 RETURN
200 '
210 ' Procedure to read and process a record
220 GOSUB 370 ' read record type and length
230 ' go to appropriate routine for processing
240 IF RECORDTYPE% = 0 GOTO 1010 ' header
250 IF RECORDTYPE% = 6 GOTO 1120 ' range
260 IF RECORDTYPE% = 13 GOTO 1340 ' integer value
270 IF RECORDTYPE% = 14 GOTO 1430 ' double precision value
280 IF RECORDTYPE% = 15 GOTO 1540 ' character string (label)
290 IF RECORDTYPE% = 16 GOTO 1650 ' formula and value
300 IF RECORDTYPE% = 1 GOTO 1800 ' end of worksheet
310 ' not a type to be processed -- read remaining portion
320 FOR I%=1 TO RECORDLENGTH%
330 GOSUB 480 ' get the next byte
340 NEXT I%
350 RETURN
360 '
370 ' Procedure to get the type and length of the record
380 ' get record type
390 GOSUB 480
400 GOSUB 480
410 RECORDTYPE% = CVI ( PREVIOUSBYTE$ + BYTE$ )
420 ' get record length
430 GOSUB 480
440 GOSUB 480
450 RECORDLENGTH% = CVI ( PREVIOUSBYTE$ + BYTE$ )
460 RETURN
470 '
480 ' Procedure to get the next byte
490 PREVIOUSBYTE$ = BYTE$
500 BYTE$ = MID$(BUFFER$,POINTER%,1)
510 POINTER% = POINTER% + 1
520 IF (POINTER% <= 128) THEN RETURN
530 GET #1
540 POINTER% = 1
550 RETURN
560 '
570 ' Procedure to get format, row and column for a data record
580 GOSUB 480
590 FORMATBYTE$=BYTE$
600 GOSUB 480
610 GOSUB 480
620 COLUMN% = CVI ( PREVIOUSBYTE$ + BYTE$ )
630 GOSUB 480
640 GOSUB 480
650 ROW% = CVI ( PREVIOUSBYTE$ + BYTE$ )
660 RETURN
670 '
680 ' Procedure to print cell location
690 ' convert column to alphabetic characters
700 CHAR1% = COLUMN% \ 26
710 CHAR2% = COLUMN% MOD 26
720 IF CHAR1% = 0 THEN ALPHA$ = " " ELSE ALPHA$ = CHR$(64+CHAR1%)
730 ALPHA$ = ALPHA$ + CHR$(65+CHAR2%)
740 ' print column and row
750 PRINT ALPHA$; ROW%+1;
760 RETURN
770 '
780 ' Procedure to convert double precision number
790 ' test for NA code
800 IF ((BYT%(1)=255) AND (BYT%(2)=240)) THEN ISNA%=1 ELSE ISNA%=0
810 IF ISNA% = 1 THEN RETURN
820 ' test for zero
830 IF (BYT%(1)=0) AND (BYT%(2)=0) THEN DOUBLE#=0!: RETURN
840 ' get sign
850 IF ((BYT%(1) AND 128) >0) THEN SIGN%=-1 ELSE SIGN%=1
860 ' get exponent
870 BYT%(1) = BYT%(1) AND 127
880 BYT2LEFT% = (BYT%(2) AND 240)\16
890 BYT2RIGHT% = BYT%(2) AND 15
900 EXPONENT% = BYT%(1)*16 + BYT2LEFT% - 1023
910 ' get mantissa
920 SUM# = 0
930 FOR I% = 8 TO 3 STEP -1
940 SUM# = ( SUM# + BYT%(I%) ) / 256
950 NEXT I%
960 SIGNIFICAND# = 1 + (BYT2RIGHT%/16) + (SUM#/16)
970 ' compute value
980 DOUBLE# = SIGN% * (SIGNIFICAND# * (2^EXPONENT%))
990 RETURN
1000 '
1010 ' Procedure to process a header record (type 0)
1020 IF RECORDLENGTH% <> 2 THEN GOTO 1090
1030 GOSUB 480
1040 IF BYTE$ <> CHR$(4) THEN GOTO 1090
1050 GOSUB 480
1060 IF BYTE$ <> CHR$(4) THEN GOTO 1090
1070 RETURN
1080 ' error -- halt processing
1090 PRINT "ERROR -- Not a Valid Worksheet File"
1100 END
1110 '
1120 ' Procedure to process a range record (type 6)
1130 ' find range from which data were saved
1140 GOSUB 480
1150 GOSUB 480
1160 FROMCOL% = CVI ( PREVIOUSBYTE$ + BYTE$)
1170 GOSUB 480
1180 GOSUB 480
1190 FROMROW% = CVI ( PREVIOUSBYTE$ + BYTE$)
1200 GOSUB 480
1210 GOSUB 480
1220 TOCOL% = CVI ( PREVIOUSBYTE$ + BYTE$)
1230 GOSUB 480
1240 GOSUB 480
1250 TOROW% = CVI ( PREVIOUSBYTE$ + BYTE$)
1260 ' find lower right corner
1270 ROW% = TOROW% - FROMROW%
1280 COLUMN% = TOCOL% - FROMCOL%
1290 PRINT "Lower Right Corner: ";
1300 GOSUB 680 ' print cell location
1310 PRINT
1320 RETURN
1330 '
1340 ' Procedure to process an integer record (type 13)
1350 GOSUB 570 ' get format, row and column
1360 GOSUB 680 ' print cell location
1370 GOSUB 480
1380 GOSUB 480
1390 VALUE% = CVI ( PREVIOUSBYTE$ + BYTE$ )
1400 PRINT TAB(9); VALUE%
1410 RETURN
1420 '
1430 ' Procedure to process a double precision value record (type 14)
1440 GOSUB 570 ' get format, row and column
1450 GOSUB 680 ' print cell location
1460 FOR I% = 1 TO 8
1470 GOSUB 480
1480 BYT%(9-I%) = ASC ( BYTE$ )
1490 NEXT I%
1500 GOSUB 780 ' convert to double-precision number
1510 IF ISNA% = 1 THEN PRINT TAB(9); "NA" ELSE PRINT TAB(9); DOUBLE#
1520 RETURN
1530 '
1540 ' Procedure to process a character string record (type 15)
1550 GOSUB 570 ' get format, row and column
1560 GOSUB 680 ' print cell location
1570 CHARSTRING$ = ""
1580 FOR I% = 1 TO (RECORDLENGTH% - 5)
1590 GOSUB 480
1600 CHARSTRING$ = CHARSTRING$ + BYTE$
1610 NEXT I%
1620 PRINT TAB(9); CHARSTRING$
1630 RETURN
1640 '
1650 ' Procedure to process a formula record (type 16)
1660 GOSUB 570 ' get format, row and column
1670 GOSUB 680 ' print cell location
1680 FOR I% = 1 TO 8
1690 GOSUB 480
1700 BYT%(9-I%) = ASC ( BYTE$ )
1710 NEXT I%
1720 GOSUB 780 ' convert to double-precision number
1730 IF ISNA% = 1 THEN PRINT TAB(9); "NA" ELSE PRINT TAB(9); DOUBLE#
1740 ' read past formula bytes
1750 FOR I% = 1 TO (RECORDLENGTH% - 13)
1760 GOSUB 480
1770 NEXT I%
1780 RETURN
1790 '
1800 ' Procedure to process an end-of-worksheet record (type 1)
1810 PRINT "End of Worksheet File"
1820 RETURN